<?php

function getMonthLastDay($month, $year)
{
        switch ($month) {
            case 4 :
            case 6 :
            case 9 :
            case 11 :
                $days = 30;
                break;
            case 2 :
                if ($year % 4 == 0) {
                    if ($year % 100 == 0) {
                        $days = $year % 400 == 0 ? 29 : 28;
                    } else {
                        $days = 29;
                    }
                } else {
                    $days = 28;
                }
                break;
            default :
                $days = 31;
                break;
        }
        return $days;
    }
//转换插入SQL 语句
function to_insert_sql($table, $data, $db_pre = '')
{
    $tablepre = 'sp_';
    $name_str = $value_str = $comma = '';
    if (is_array($data) && !empty($data)) {
        foreach ($data as $key => $value) {
            $name_str .= $comma . '`' . $key . '`';
            $value_str .= $comma . '\'' . $value . '\'';
            $comma = ', ';
        }
    }
    if ($db_pre == 1) {
        $table = $table;
    } elseif ($tablepre) {
        $table = $tablepre . $table;
    }
    $sql = "INSERT INTO `$table`($name_str) VALUES($value_str);";
    return $sql;
}



/**
 * 获取数据字典
 * @param string $key      //键值，方便查找数据
 * @param string $fileName //字典文件名 目录Common/Dict/
 * @return mixed
 */
function dict($key = '', $fileName = 'Setting') {
	static $_dictFileCache  =   array();
	$file = APP_PATH . 'Common' . DS . 'Dict' . DS . $fileName . '.php';
	if (!file_exists($file)){
		unset($_dictFileCache);
		return null;
	}
	if(!$key && !empty($_dictFileCache)) return $_dictFileCache;
	if ($key && isset($_dictFileCache[$key])) return $_dictFileCache[$key];
	$data = require_once $file;
	$_dictFileCache = $data;
	return $key ? $data[$key] : $data;
}

/**
 * 字符串截取，支持中文和其他编码
 * @param string $str     需要转换的字符串
 * @param int    $start   开始位置
 * @param string $length  截取长度
 * @param string $charset 编码格式
 * @param bool   $suffix  截断显示字符
 * @return string
 */
function msubstr($str, $start=0, $length, $charset="utf-8", $suffix=false) {
	return Org\Util\String::msubstr($str, $start, $length, $charset, $suffix);
}

/**
 * 检测输入的验证码是否正确
 * @param string $code 为用户输入的验证码字符串
 * @param string $id   其他参数
 * @return bool
 */
function check_verify($code, $id = ''){
	$verify = new \Think\Verify();
	return $verify->check($code, $id);
}

/**
 * 对用户的密码进行加密
 * @param string $password
 * @param string $encrypt //传入加密串，在修改密码时做认证
 * @return array/string
 */
function password($password, $encrypt='') {
	$pwd = array();
	$pwd['encrypt'] =  $encrypt ? $encrypt : Org\Util\MyString::randString(6);
	$pwd['password'] = md5(md5(trim($password)).$pwd['encrypt']);
	return $encrypt ? $pwd['password'] : $pwd;
}

/**
 * 解析多行sql语句转换成数组
 * @param string $sql
 * @return array
 */
function sql_split($sql) {
	$sql = str_replace("\r", "\n", $sql);
	$ret = array();
	$num = 0;
	$queriesarray = explode(";\n", trim($sql));
	unset($sql);
	foreach($queriesarray as $query) {
		$ret[$num] = '';
		$queries = explode("\n", trim($query));
		$queries = array_filter($queries);
		foreach($queries as $query) {
			$str1 = substr($query, 0, 1);
			if($str1 != '#' && $str1 != '-') $ret[$num] .= $query;
		}
		$num++;
	}
	return($ret);
}

/**
 * 格式化字节大小
 * @param  number $size      字节数
 * @param  string $delimiter 数字和单位分隔符
 * @return string            格式化后的带单位的大小
 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
 */
function format_bytes($size, $delimiter = '') {
	$units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB');
	for ($i = 0; $size >= 1024 && $i < 5; $i++) $size /= 1024;
	return round($size, 2) . $delimiter . $units[$i];
}

/**
 * 取得文件扩展
 * @param string $filename 文件名
 * @return string
 */
function file_ext($filename) {
	return strtolower(trim(substr(strrchr($filename, '.'), 1, 10)));
}

/**
 * 文件是否存在
 * @param string $filename  文件名
 * @param string $type     其他参数
 * @return boolean  
 */
function file_exist($filename ,$type=''){
	switch (strtoupper(C('FILE_UPLOAD_TYPE'))){
		case 'SAE':
			$arr = explode('/', ltrim($filename, './'));
			$domain = array_shift($arr);
			$filePath = implode('/', $arr);
			$s = new SaeStorage();
			return $s->fileExists($domain, $filePath);
			break;

		case 'FTP':
			$storage = new \Common\Plugin\Ftp();
			return $storage->has($filename);
			break;

		default:
			return \Think\Storage::has($filename ,$type);
	}
}

/**
 * 文件内容读取
 * @param string $filename  文件名
 * @param string $type     其他参数
 * @return bool
 */
function file_read($filename, $type=''){
	switch (strtoupper(C('FILE_UPLOAD_TYPE'))){
		case 'SAE':
			$arr = explode('/', ltrim($filename, './'));
			$domain = array_shift($arr);
			$filePath = implode('/', $arr);
			$s=new SaeStorage();
			return $s->read($domain, $filePath);
			break;

		case 'FTP':
			$storage = new \Common\Plugin\Ftp();
			return $storage->read($filename);
			break;

		default:
			return \Think\Storage::read($filename, $type);
	}
}

/**
 * 文件写入
 * @param string $filename  文件名
 * @param string $content  文件内容
 * @param string $type     其他参数
 * @return bool
 */
function file_write($filename, $content, $type=''){
	switch (strtoupper(C('FILE_UPLOAD_TYPE'))){
		case 'SAE':
			$s=new SaeStorage();
			$arr = explode('/',ltrim($filename,'./'));
			$domain = array_shift($arr);
			$save_path = implode('/',$arr);
			return $s->write($domain, $save_path, $content);
			break;

		case 'FTP':
			$storage = new \Common\Plugin\Ftp();
			return $storage->put($filename, $content);
			break;

		default:
			return \Think\Storage::put($filename, $content, $type);
	}
}

/**
 * 文件删除
 * @param string $filename 文件名
 * @param string $type     其他参数
 * @return bool
 */
function file_delete($filename ,$type=''){
	switch (strtoupper(C('FILE_UPLOAD_TYPE'))){
		case 'SAE':
			$arr = explode('/', ltrim($filename, './'));
			$domain = array_shift($arr);
			$filePath = implode('/', $arr);
			$s = new SaeStorage();
			return $s->delete($domain, $filePath);
			break;

		case 'FTP':
			$storage = new \Common\Plugin\Ftp();
			return $storage->unlink($filename);
			break;

		default:
			return \Think\Storage::unlink($filename ,$type);
	}
}

/**
 * 获取文件URL
 * @param string $filename  文件名
 * @return string
 */
function file_path_parse($filename){
	$config = C('TMPL_PARSE_STRING');
	return str_ireplace(UPLOAD_PATH, '', $filename);
}

/**
 * 验证远程链接地址是否正确
 * @param string $url
 * @return bool
 */
function file_exist_remote($url){
	$curl = curl_init($url);
	curl_setopt($curl, CURLOPT_REFERER, $url); //伪造来路
	curl_setopt($curl,CURLOPT_USERAGENT, 'Alexa (IA Archiver)');
	curl_setopt($curl, CURLOPT_NOBODY, true);
	$result = curl_exec($curl);
	$found = false;
	if ($result !== false) {
		$statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
		if ($statusCode == 200) $found = true;
	}
	curl_close($curl);
	return $found;
}

/**
 * 远程文件内容读取
 * @param string $url
 * @return string
 */
function file_read_remote($url){
	$curl = curl_init($url);
	curl_setopt($curl, CURLOPT_REFERER, $url); //伪造来路
	curl_setopt($curl,CURLOPT_USERAGENT, 'Alexa (IA Archiver)');
	curl_setopt($curl,CURLOPT_HEADER,0);
	curl_setopt($curl, CURLOPT_NOBODY, false);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER,1);
	$result = curl_exec($curl);
	curl_close($curl);
	return $result;
}

/**
 * 文件名加后缀
 * @param string $string
 * @param string $subfix
 * @return string
 */
function file_subfix($string, $subfix = ''){
	return preg_replace("/(\.\w+)$/", "{$subfix}\\1", $string);
}

/**
 * 发送邮件
 * @param string $to      收件人
 * @param string $subject 主题
 * @param string $body    内容
 * @param array $config
 * @return bool
 */
function send_email($to, $subject, $body, $config = array()){
	$email = new \Common\Plugin\Email($config);
	$email->send($to, $subject, $body);
	return $email->result;
}

/**
 * 生成签名
 * @param array $param
 * @return string
 */
function sign($param = array()){
	return md5(base64_encode(hash_hmac('sha1', http_build_query($param), C('API_SIGN'), true)));
}

/**
 * xml转数组
 * @param string $xml
 * @param bool $isFile
 * @return null|array
 */
function xml2array($xml, $isFile = false){
	if($isFile && file_exist($xml)) $xml = file_read($xml);
	$xml = @simplexml_load_string($xml);

	if(is_object($xml)){
		$xml = json_encode($xml);
		$xml = @json_decode($xml, true);
	}
	if(!is_array($xml)) return null;

	return $xml;
}

/**
 * 输出带格式打印数据 , 并终止程序执行
 *
 */
function dprint($data = null)
{
    if (count(func_get_args()) > 1) {
        $data = func_get_args();
    }

    echo "<pre>";
    print_r($data);
    echo "</pre>";
    exit;
}
/**
 * 输出带格式打印数据
 *
 */
function pprint($data = null)
{
    if (count(func_get_args()) > 1) {
        $data = func_get_args();
    }
    echo "<pre>";
    print_r($data);
    echo "</pre>";
}
/*check phonenum
*/
function checkPhoneNum($phone){
    if(preg_match("/1[3458]{1}\d{9}$/",$phone)){
        return true;
    }else{
        return false;
    }
}

/**
 * 读取业务配置
 * @param string	 $module_name	配置模块名称
 * @param string	 $file_name		文件名称
 * @param string	 $func_name		方法名称
 * @param string	 $param_info	参数列表
 * @return mixed|multitype:
 */
// function readerConfig($module_name,$file_name,$func_name,$param_info=null){
// 	static $reader_cache = array();
// 	$file_path = APP_PATH.'Usap/Conf/'.ucfirst($module_name).'/'.$file_name.EXT;
// 	$class_name = 'Usap\\Conf\\'.ucfirst($module_name).'\\'.$file_name;
// 	if(require_cache($file_path) && class_exists($class_name)){
		
// 		$config_obj = new $class_name;
// 		if(method_exists($config_obj,$func_name)){
// 			if(!empty($param_info) && is_array($param_info)){
				
// 				return call_user_func_array(array($config_obj,$func_name), $param_info);
// 			}
// 			return call_user_func(array($config_obj,$func_name),$param_info);
// 		}
// 	}
// 	return array();
// }

/**
 * 记录日志
 * @param  stirng $name
 * @param string $app_name
 * @param array|string $log_info
 */
// function Logger($name,$app_name,$info,$file=__FILE__,$line=__LINE__){

// 	file_put_contents('/logs/t.log', $file.' '.$line);
// 	Vendor('Log4PHP.Logger');//引入Log4PHP库文件
// 	\Logger::configure(C('LOG4PHP'));//记载配置文件
// 	if(is_array($info)){
// 		$info = json_encode($info,JSON_UNESCAPED_UNICODE);
// 	}
// 	\Logger::getLogger($name)->apps($app_name)->info($info);
// }

//计算CXy 的值,从X中任取y个数的组合数
function ComputeCombineNum($M,$N)
{
    if($N < 0 || $M < 0)
    {
        return 0;
    }
    $FirstValue  = 1;
    $SecondValue = 1;
    if($N > $M)
    {
        return 0;
    }
    elseif($N == $M)
    {
        return 1;
    }
    else
    {
        for($I = 0 ; $I < $N; $I++)
        {
            $FirstValue  *= $M - $I;
            $SecondValue *= $I + 1;
        }
        $ResultNum = $FirstValue / $SecondValue;
        return $ResultNum;
    }
}

/* 按照给定的长度length，将数组a中元素拆分组合，返回拆出来的若干组组合
*
* array(1,2,3,4) length = 2 返回结果 array( array(1,2),array(1,3),array(1,4),array(2,3),array(2,4),array(3,4))
*
*/
function splitCombineArray($a, $length)
{
    $Result = array();
    sort($a);
    if (count($a) < $length || $length < 1)
    {
        return $Result;
    }
    elseif (count($a) == $length)
    {
        $Result[0] = $a;
        return $Result;
    }
    if ($length == 1)
    {
        foreach ($a as $Key => $n)
        {
            $Result[$Key][0] = $n;
        }
        return $Result;
    }
    if ($length > 1)
    {
        foreach ($a as $Key => $Num)
        {
            $b = array_slice($a, $Key + 1);
            $TmpResultList = splitCombineArray($b, $length - 1);
            if (count($TmpResultList) > 0)
            {
                foreach ($TmpResultList as $Info)
                {
                    $Info[] = $Num;
                    sort($Info);
                    $Result[] = $Info;
                }
            }
        }
    }
    return $Result;
}

/**
 * 系统非常规MD5加密方法
 * @param  string $str 要加密的字符串
 * @return string
 */
function think_md5($str, $key = 'ThinkUCenter'){
	return '' === $str ? '' : md5(sha1($str) . $key);
}

/**
 * 系统加密方法
 * @param string $data 要加密的字符串
 * @param string $key  加密密钥
 * @param int $expire  过期时间 (单位:秒)
 * @return string
 */
function think_encrypt($data, $key, $expire = 0) {
	$key  = md5($key);
	$data = base64_encode($data);
	$x    = 0;
	$len  = strlen($data);
	$l    = strlen($key);
	$char =  '';
	for ($i = 0; $i < $len; $i++) {
		if ($x == $l) $x=0;
		$char  .= substr($key, $x, 1);
		$x++;
	}
	$str = sprintf('%010d', $expire ? $expire + time() : 0);
	for ($i = 0; $i < $len; $i++) {
		$str .= chr(ord(substr($data,$i,1)) + (ord(substr($char,$i,1)))%256);
	}
	return str_replace('=', '', base64_encode($str));
}

/**
 * 系统解密方法
 * @param string $data 要解密的字符串 （必须是think_encrypt方法加密的字符串）
 * @param string $key  加密密钥
 * @return string
 */
function think_decrypt($data, $key){
	$key    = md5($key);
	$x      = 0;
	$data   = base64_decode($data);
	$expire = substr($data, 0, 10);
	$data   = substr($data, 10);
	if($expire > 0 && $expire < time()) {
		return '';
	}
	$len  = strlen($data);
	$l    = strlen($key);
	$char = $str = '';
	for ($i = 0; $i < $len; $i++) {
		if ($x == $l) $x = 0;
		$char  .= substr($key, $x, 1);
		$x++;
	}
	for ($i = 0; $i < $len; $i++) {
		if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1))) {
			$str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1)));
		}else{
			$str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1)));
		}
	}
	return base64_decode($str);
}

//WordPress 计算中文字符串长度
function utf8_strlen($string = null) {
	// 将字符串分解为单元
	preg_match_all("/./us", $string, $match);
	// 返回单元个数
	return count($match[0]);
}

/*-------------数据校验---------------*/
/**
 * 时间格式校验：是否是日期 + 时间
 * @param string	 $value
 * @return boolean
 */
function validate_is_datetime($value){
	$test = @strtotime($value);
	if ($test === false || $test === - 1)
	{
		return false;
	}
	return true;
}

/* 获取当前时间戳，毫秒 */
function microtime_float()
{
	list($usec, $sec) = explode(" ", microtime()); 
	return (float)sprintf('%.0f',(floatval($usec) + floatval($sec))* 1000);
}

/* 
 * js 页面跳转
 *  */
function url_goto($url){
	$script = "window.location.href ='".$url."';";
	$html = <<<EOF
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head><body>
<script type="text/javascript">
##script##</script></body>
</html>
EOF;
	$html=str_replace('##script##',$script,$html);
	echo $html;
	exit;
}

/**
 * 把一个二维数组中的某个或者某些字段当成 key
 *
 * @author liuchao
 *
 * @param array        $array 二维数组
 * @param string|array $field 字段
 *
 * @return array
 */
function useFieldAsArrayKey($array, $field) {

    $newArr = [];

    if (is_array($field)) {
        foreach ($array as $key => $value) {
            $newKey = '';
            foreach ($field as $f) {
                $newKey .= $value[strval($f)];
            }

            if (!isset($newArr[$newKey])) {
                $newArr[$newKey] = $value;
            }
        }
    } else {
        foreach ($array as $key => $value) {

            $newArr[$value[strval($field)]] = $value;
        }
    }

    return $newArr;
}